home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-19 / l2c-19.exe / AI_UTILS.LSP < prev    next >
Text File  |  1993-06-25  |  14KB  |  485 lines

  1. ;;;----------------------------------------------------------------------------
  2. ;;;
  3. ;;;   AI_UTILS.LSP   Version 0.5
  4. ;;;
  5. ;;;   Copyright (C) 1991-1992 by Autodesk, Inc.
  6. ;;;      
  7. ;;;   Permission to use, copy, modify, and distribute this software 
  8. ;;;   for any purpose and without fee is hereby granted, provided 
  9. ;;;   that the above copyright notice appears in all copies and that 
  10. ;;;   both that copyright notice and this permission notice appear in 
  11. ;;;   all supporting documentation.
  12. ;;;      
  13. ;;;   THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
  14. ;;;   WARRANTY.  ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR
  15. ;;;   PURPOSE AND OF MERCHANTABILITY ARE HEREBY DISCLAIMED.
  16. ;;;   
  17. ;;;----------------------------------------------------------------------------
  18. ;;; (ai_abort <appname> [<error message>] )
  19. ;;;
  20. ;;; Displays critical error message in alert box and terminates all
  21. ;;; running applications.
  22. ;;;
  23. ;;; If <errmsg> is nil, no alert box or error message is displayed.
  24.  
  25.   (defun ai_abort (app msg)
  26.      (defun *error* (s)
  27.         (if old_error (setq *error* old_error))
  28.         (princ)
  29.      )
  30.      (if msg
  31.        (alert (strcat " Application error: "
  32.                       app
  33.                       " \n\n  "
  34.                       msg
  35.                       "  \n"
  36.               )
  37.        )
  38.      )
  39.      (exit)
  40.   )
  41.  
  42.  
  43. (defun ai_return (value) value)  ; Make act of returning value explicit
  44.  
  45. ;;; Beep function conditional on user-preferred setting.
  46.  
  47.     (defun ai_beep ( / f)
  48.        (write-line "\007" (setq f (open "CON" "w")))
  49.        (setq f (close f))
  50.     )
  51.  
  52. ;;; (ai_alert <message> )
  53. ;;;
  54. ;;; Shell for (alert)
  55.  
  56.     (defun ai_alert (msg)
  57.        (if ai_beep? (ai_beep))
  58.        (alert (strcat " " msg "  "))
  59.     )
  60.  
  61. ;;;  (ai_acadapp)
  62. ;;;
  63. ;;;  Check to see if acadapp is loaded (and load if necessary).
  64. ;;;
  65. ;;;  If ACADAPP is not loaded, then display a message indicating
  66. ;;;  such in an alert box, and return NIL to the caller.  This
  67. ;;;  function does not generate an error condition, so if that is
  68. ;;;  appropriate, then the caller must test the result and generate
  69. ;;;  the error condition itself.
  70. ;;;
  71.  
  72. (defun ai_acadapp ( / fname)
  73.    (setq fname (ai_acadapp_fn))
  74.    (cond
  75.       (  (= (type acad_colordlg) 'EXSUBR))              ; it's already loaded.
  76.  
  77.       (  (not (findfile fname))                         ; find it
  78.          (ai_alert (strcat "Can't find " fname "."))
  79.          (ai_return nil))
  80.  
  81.       (  (eq "failed" (xload fname "failed"))           ; load it
  82.          (ai_alert (strcat "Can't load " fname "."))
  83.          (ai_return nil))
  84.      (t)
  85.    )
  86. )
  87.  
  88. ;;; (ai_acadapp_fn)
  89. ;;;
  90. ;;; This function returns the filename & extension of the ADS
  91. ;;; ACADAPP executable for every platform.
  92.  
  93. ;;; Default filename is "acadapp" (in lower-case).
  94.  
  95. (defun ai_acadapp_fn ( / platform)
  96.    (setq platform (getvar "platform"))
  97.    (cond
  98.       (  (eq platform "Windows")           "ACADAPP.EXE")
  99.       (  (eq platform "386 DOS Extender")  "ACADAPP.EXP")
  100.  
  101.       ;;;
  102.       ;;; insert other cases as required.
  103.       ;;;
  104.  
  105.       (t "acadapp")             ; Default extension 
  106.    )
  107. )
  108.  
  109. ;;; (ai_table <table name> <bit> )
  110. ;;;
  111. ;;; Returns a list of items in the specified table.  The bit values have the
  112. ;;; following meaning:
  113. ;;;  0  List all items in the specified table.
  114. ;;;  1  Do not list Layer 0 and Linetype CONTINUOUS.
  115. ;;;  2  Do not list anonymous blocks.
  116. ;;;         A check against the 70 flag for the following bit:
  117. ;;;                  1  anonymous block
  118. ;;;  4  Do not list externally dependant items.
  119. ;;;         A check against the 70 flag is made for any of the following 
  120. ;;;         bits, which add up to 48:
  121. ;;;                 16  externally dependant
  122. ;;;                 32  resolved external or dependant
  123. ;;;  8  Do not list Xrefs.
  124. ;;;         A check against the 70 flag for the following bit:
  125. ;;;                  4  external reference
  126. ;;;  16 Add BYBLOCK and BYLAYER items to list.
  127. ;;;
  128. (defun ai_table (table_name bit / tbldata table_list just_name)
  129.   (setq tbldata nil)
  130.   (setq table_list '())
  131.   (setq table_name (strcase table_name))
  132.   (while (setq tbldata (tblnext table_name (not tbldata)))
  133.     (setq just_name (cdr (assoc 2 tbldata)))
  134.     (cond 
  135.       ((= "" just_name))               ; Never return null Shape names.
  136.       ((and (= 1 (logand bit 1))
  137.             (or (and (= table_name "LAYER") (= just_name "0"))
  138.                 (and (= table_name "LTYPE")
  139.                      (= just_name "CONTINUOUS")
  140.                 )
  141.             )
  142.       ))
  143.       ((and (= 2 (logand bit 2))
  144.             (= table_name "BLOCK")
  145.             (= 1 (logand 1 (cdr (assoc 70 tbldata))))
  146.       )) 
  147.       ((and (= 4 (logand bit 4))
  148.             ;; Check for Xref dependents only. 
  149.             (zerop (logand 4 (cdr (assoc 70 tbldata)))) 
  150.             (not (zerop (logand 48 (cdr (assoc 70 tbldata)))))
  151.             
  152.       ))
  153.       ((and (= 8 (logand bit 8))
  154.             (not (zerop (logand 4 (cdr (assoc 70 tbldata)))))
  155.       ))
  156.       ;; Vports tables can have similar names, only display one.
  157.       ((member just_name table_list)
  158.       )
  159.       (T (setq table_list (cons just_name table_list)))
  160.     )
  161.   )
  162.   (cond
  163.     ((and (= 16 (logand bit 16))
  164.           (= table_name "LTYPE") ) (setq table_list (cons "BYBLOCK" 
  165.      (cons "BYLAYER" table_list))) ) 
  166.     (t) 
  167.   ) 
  168.   (ai_return table_list) 
  169. )
  170.  
  171. ;;;
  172. ;;; (ai_strtrim <string> )
  173. ;;;
  174. ;;; Trims leading and trailing spaces from strings.
  175. (defun ai_strtrim (s)
  176.   (cond 
  177.     ((/= (type s) 'str) nil)
  178.     (t (ai_strltrim (ai_strrtrim s)))
  179.   )
  180. )
  181. (defun ai_strltrim (s)
  182.   (cond 
  183.     ((eq s "") s)
  184.     ((/= " " (substr s 1 1)) s)
  185.     (t (ai_strltrim (substr s 2)))
  186.   )
  187. )
  188. (defun ai_strrtrim (s)
  189.   (cond 
  190.     ((eq s "") s)
  191.     ((/= " " (substr s (strlen s) 1)) s)
  192.     (t (ai_strrtrim (substr s 1 (1- (strlen s)))))
  193.   )
  194. )
  195.  
  196. ;;;
  197. ;;; Pass a number, an error message, and a range.  If the value is good, it is
  198. ;;; returned, else an error is displayed.  
  199. ;;;  Range values:
  200. ;;;                 0 - any numeric input OK
  201. ;;;                 1 - reject positive
  202. ;;;                 2 - reject negative
  203. ;;;                 4 - reject zero
  204. ;;;                 
  205. (defun ai_num (value error_msg range / good_value)
  206.   (cond
  207.     ;; is it a number
  208.     ((not (setq good_value (distof value)))
  209.       (set_tile "error" error_msg)
  210.       nil
  211.     )
  212.     ;; is it positive
  213.     ((and (= 1 (logand 1 range))
  214.        (= (abs good_value) good_value)
  215.      )
  216.       (set_tile "error" error_msg)
  217.       nil
  218.     )
  219.     ;; is it zero
  220.     ((and (= 2 (logand 2 range))
  221.        (= 0.0 good_value)
  222.      )
  223.       (set_tile "error" error_msg)
  224.       nil
  225.     )
  226.     ;; is it negative
  227.     ((and (= 4 (logand 4 range))
  228.        (/= (abs good_value) good_value)
  229.      )
  230.       (set_tile "error" error_msg)
  231.       nil
  232.     )
  233.     (T good_value)
  234.   )
  235. )
  236.  
  237. ;;;
  238. ;;; Pass an angle and an error message.  If good, the angle is returned else
  239. ;;; nil and an error message displayed.
  240. ;;;
  241. (defun ai_angle(value error_msg / good_value)
  242.   (cond
  243.     ((and (setq good_value (angtof value))
  244.      )
  245.       (set_tile "error" "")
  246.       (atof (angtos good_value))
  247.     )
  248.     (T (set_tile "error" error_msg) nil)
  249.   )
  250. )
  251.  
  252. ;;;
  253. ;;;  Error routine.
  254. ;;;
  255. (defun ai_error (s)              ; If an error (such as CTRL-C) occurs
  256.   (if (not (member s '("Function cancelled" "console break")))
  257.     (princ (strcat "\nError: " s))
  258.   )
  259.   (if undo_init (ai_undo_pop))              ; Deal with UNDO
  260.   (if old_error (setq *error* old_error))   ; Restore old *error* handler
  261.   (if old_cmd (setvar "cmdecho" old_cmd))   ; Restore cmdecho value
  262.   (princ)
  263. )
  264.  
  265. ;;;
  266. ;;; Routines that check CMDACTIVE and post an alert if the calling routine
  267. ;;; should not be called in the current CMDACTIVE state.  The calling 
  268. ;;; routine calls (ai_trans) if it can be called transparently or 
  269. ;;; (ai_notrans) if it cannot.
  270. ;;;
  271. ;;;           1 - Ordinary command active.
  272. ;;;           2 - Ordinary and transparent command active.
  273. ;;;           4 - Script file active.
  274. ;;;           8 - Dialogue box active.
  275. ;;;
  276. (defun ai_trans ()
  277.   (if (zerop (logand (getvar "cmdactive") (+ 2 4 8) ))
  278.     T
  279.     (progn 
  280.       (alert "This command may not be invoked transparently.")
  281.       nil
  282.     )
  283.   )
  284. )
  285.  
  286. (defun ai_transd ()
  287.   (if (zerop (logand (getvar "cmdactive") (+ 2 4) ))
  288.     T
  289.     (progn 
  290.       (alert "This command may not be invoked transparently.")
  291.       nil
  292.     )
  293.   )
  294. )
  295.  
  296. (defun ai_notrans ()
  297.   (if (zerop (logand (getvar "cmdactive") (+ 1 2 4 8) ))
  298.     T
  299.     (progn 
  300.       (alert "This command may not be invoked transparently.")
  301.       nil
  302.     )
  303.   )
  304. )
  305.  
  306. ;;; (ai_aselect)
  307. ;;;
  308. ;;; Looks for a current selection set, and returns it if found,
  309. ;;; or throws user into interactive multiple object selection,
  310. ;;; and returns the resulting selection set if one was selected.
  311. ;;;
  312. ;;; Sets the value of ai_seltype to:
  313. ;;;
  314. ;;;    1 = resulting selection set was autoselected
  315. ;;;    2 = resulting selection set was prompted for.
  316.  
  317.    (defun ai_aselect ( / ss)
  318.       (cond
  319.          (  (and (eq 1 (logand 1 (getvar "pickfirst")))
  320.                  (setq ss (ssget "i")))
  321.             (setq ai_seltype 1)
  322.             (ai_return ss))
  323.          (  (setq ss (ssget))
  324.             (setq ai_seltype 2)
  325.             (ai_return ss))
  326.       )
  327.    )
  328.  
  329. ;;; (ai_aselect1 <msg> )
  330. ;;;
  331. ;;; Looks for ONE autoselected entity, or throws the user into
  332. ;;; interactive entity selection (one entity, where a selection
  333. ;;; point is insignificant).  <msg> is the prompt generated if
  334. ;;; interactive selection is invoked.
  335. ;;;
  336. ;;; Sets the value of ai_seltype to:
  337. ;;;
  338. ;;;    1 = resulting entity was autoselected
  339. ;;;    2 = resulting entity was prompted for.
  340.  
  341.  
  342.    (defun ai_aselect1 (msg / ent)
  343.       (cond
  344.          (  (and (eq 1 (logand 1 (getvar "pickfirst")))
  345.                  (setq ent (ssget "i"))
  346.                  (eq 1 (sslength ent)))
  347.             (setq ai_seltype 1)
  348.             (ai_return (ssname ent 0)))
  349.  
  350.          (  (setq ent (entsel msg))
  351.             (setq ai_seltype 2)
  352.             (ai_return (car ent)))
  353.       )
  354.    )
  355.  
  356. ;;;
  357. ;;; A function that turns on UNDO so that some existing routines will work.
  358. ;;; Do not use with new routines as they should be designed to operate with
  359. ;;; any UNDO setting.
  360. ;;;
  361. (defun ai_undo_on ()
  362.   (setq undo_setting (getvar "undoctl"))
  363.   (cond
  364.     ((= 2 (logand undo_setting 2))     ; Undo is one
  365.       (command "_.undo" "control" "_all" "_.undo" "_auto" "_off")
  366.     )
  367.     ((/= 1 (logand undo_setting 1))    ; Undo is disabled
  368.       (command "_.undo" "_all" "_.undo" "_auto" "_off")
  369.     )
  370.   )
  371. )
  372.  
  373. ;;;
  374. ;;; Return UNDO to the initial setting.  Do not use with new routines as they 
  375. ;;; should be designed to operate with any UNDO setting.
  376. ;;;
  377. (defun ai_undo_off ()
  378.   (cond 
  379.     ((/= 1 (logand undo_setting 1))
  380.       (command "_.undo" "_control" "_none")
  381.     )
  382.     ((= 2 (logand undo_setting 2))
  383.       (command "_.undo" "_control" "_one")
  384.     )
  385.   )
  386. )
  387.  
  388. ;;;
  389. ;;; UNDO handlers.  When UNDO ALL is enabled, Auto must be turned off and 
  390. ;;; GROUP and END added as needed. 
  391. ;;;
  392. (defun ai_undo_push()
  393.   (setq undo_init (getvar "undoctl"))
  394.   (cond
  395.     ((and (= 1 (logand undo_init 1))   ; enabled
  396.           (/= 2 (logand undo_init 2))  ; not ONE (ie ALL is ON)
  397.           (/= 8 (logand undo_init 8))   ; no GROUP active
  398.      )
  399.       (command "_.undo" "_group")
  400.     )
  401.     (T)
  402.   )  
  403.   ;; If Auto is ON, turn it off.
  404.   (if (= 4 (logand 4 undo_init))
  405.       (command "_.undo" "_auto" "_off")
  406.   )
  407. )
  408.  
  409. ;;;
  410. ;;; Add an END to UNDO and return to initial state.
  411. ;;;
  412. (defun ai_undo_pop()
  413.   (cond 
  414.     ((and (= 1 (logand undo_init 1))   ; enabled
  415.           (/= 2 (logand undo_init 2))  ; not ONE (ie ALL is ON)
  416.           (/= 8 (logand undo_init 8))   ; no GROUP active
  417.      )
  418.       (command "_.undo" "_end")
  419.     )
  420.     (T)
  421.   )  
  422.   ;; If it has been forced off, turn it back on.
  423.   (if (= 4 (logand undo_init 4))
  424.     (command "_.undo" "_auto" "_on")
  425.   )  
  426. )
  427. ;;;
  428. ;;; (get_dcl "FILTER")
  429. ;;;
  430. ;;; Checks for the existence of, and loads the specified .DCL file,
  431. ;;; or aborts with an appropriate error message, causing the initial
  432. ;;; load of the associated application's .LSP file to be aborted as
  433. ;;; well, disabling the application.
  434. ;;;
  435. ;;; If the load is successful, the handle of the .DCL file is then
  436. ;;; added to the ASSOCIATION LIST ai_support, which would have the
  437. ;;; following structure:
  438. ;;;
  439. ;;;
  440. ;;;   (("DCLFILE1" . 1) ("DCLFILE2" . 2)...)
  441. ;;;
  442. ;;; If result of (ai_dcl) is NIL, then .DCL file is not avalable,
  443. ;;; or cannot be loaded (the latter can result from a DCL audit).
  444. ;;;
  445. ;;; Applications that call (ai_dcl) should test its result, and
  446. ;;; terminate or abort if it is nil.  Normal termination rather
  447. ;;; than aborting with an error condition, is desirable if the
  448. ;;; application can be invoked transparently.
  449. ;;;
  450. (defun ai_dcl (dcl_file / dcl_handle)
  451.   (cond
  452.     ;; If the specified .DCL is already loaded then
  453.     ;; just return its handle to the caller.
  454.     ((ai_return (cdr (assoc dcl_file ai_support))))
  455.  
  456.     ;; Otherwise, try to FIND the .DCL file, and display a
  457.     ;; an appropriate message if it can't be located, and
  458.     ;; return Nil to the caller:
  459.     ((not (findfile (strcat dcl_file ".dcl")))
  460.       (ai_alert
  461.         (strcat
  462.           "Can't locate dialog definition file " dcl_file
  463.           ".dcl\n Check your support directory."))
  464.       (ai_return nil)
  465.     )
  466.     ;; The file has been found.  Now try to load it.  If it
  467.     ;; can't be succesfully loaded, then indicate such, and
  468.     ;; abort the caller:
  469.     ((or (not (setq dcl_handle (load_dialog dcl_file)))
  470.          (> 1 dcl_handle))
  471.       (ai_alert
  472.         (strcat
  473.           "Can't load dialog control file " dcl_file ".dcl"
  474.           "\n Check your support directory."))
  475.       (ai_return nil)
  476.     )
  477.     ;; Otherwise, the file has been loaded, so add it's handle
  478.     ;; to the FILE->HANDLE association list AI_SUPPORT, and
  479.     ;; return the handle to the caller:
  480.     (t (setq ai_support (cons (cons dcl_file dcl_handle) ai_support))
  481.       (ai_return dcl_handle)
  482.     )
  483.   )
  484. )
  485.